package edu.mis.modules.user;

import com.jfinal.aop.Clear;
import com.jfinal.core.ActionKey;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;

import edu.mis.model.Resource;
import edu.mis.model.Role;
import edu.mis.model.User;
import edu.mis.modules.log.LogInterceptor;


public class UserController extends Controller {
	//@Permission("user:view")  //自定义注解权限
	public void index() {
		render("user.html");
	}
	@ActionKey ("user/list") //该注解可以省略，此处的user与MisConfig中的me.add("/user", UserController.class,"views/user")对“/user”对应;	
	public void list() {
		Integer page = getParaToInt("page"); //page和rows是easyui分页规定的后端的参数
		Integer rows = getParaToInt("rows"); //得到rows参数值并转换成int
		Page<User> data = User.dao.paginate(page, rows); //JFinal自带分页方法
		setAttr("rows", data.getList());	//rows和total是easyui分页对后端传递过来数据的字段要求，rows为数据集，total为总数
		setAttr("total", data.getTotalRow());
		renderJson(); //输出json数据。可通过"localhost:8080/mis/user/list"查看输出的json数据。
	}
	//TODO JFinal拦截控制器方法，本项目easyUI的CRUD封装省略了在控制器中定位视图资源(add.html)，只能拦截提交方法(add)。<br>
	//导致没有权限也能打开添加页面，但无法提交的问题。
	//@Permission("user:add")
	public void add() throws Exception {
		Model<User> user = getModel(User.class,"");
		if (user.save()) {
			setAttr("success",true);  //此处的success和msg是前端easyUi封装自定义的接收参数。
			setAttr("msg","添加用户成功!");//详见WebRoot/plugins/jquery-ext/easyui-ext.js中的data.success和data.msg
		}else{
			setAttr("success",false);
			setAttr("msg","添加用户失败!");
		}
		renderJson();
	}
	//@ActionKey ("user/update") //如需自定义路径，则加上@ActionKey注解
	public void edit() throws Exception {
		Model<User> user = getModel(User.class,"");
		if (user.update()) {
			setAttr("success",true);
			setAttr("msg","修改用户成功!");
		}else{
			setAttr("success",false);
			setAttr("msg","修改用户失败!");
		}
		renderJson();
	}
	//访问地址user/delete
	public void delete() throws Exception {
		String ids=getPara("ids");
		if(User.dao.deleteBatch(ids)) {
			setAttr("success",true);
		    setAttr("msg","删除用户成功!");
		}else{
			setAttr("success",false);
			setAttr("msg","删除用户失败!");
		}
		renderJson();
	}

	/**
	 * 为user下拉菜单赋值<br>
	 * blog中有user的外键约束。
	 */
	public void tree(){
		renderJson(Db.find("SELECT u.id,u.name FROM user u"));  //不建议在Controller写sql语句，难以维护，尽量写在model中
	}
	@Clear({LoginInterceptor.class,LogInterceptor.class})//使用@Clear注解，则login方法不会被LoginInterceptor拦截（此处为LoginInterceptor为全局拦截器）
	public void login() {
		User user= getSessionAttr("loginUser");
    	if(user==null){
        	user=User.dao.login(getPara("name"), getPara("password"));
        	if(user==null){
            	setAttr("msg", "用户名或密码不对!");
            	renderFreeMarker("/login.html");
        	}else{
        		//根据userid去查找菜单资源
        		setAttr("resource", Resource.dao.findMenuByUser(user.getId()));
        		setSessionAttr("loginUser", user);
        		renderFreeMarker("/index.html");
        	}
    	}else{
    		//根据userid去查找菜单资源
    		setAttr("resource", Resource.dao.findMenuByUser(user.getId()));
    		renderFreeMarker("/index.html");
    	}
    		
	}
	/**
	 * 用户Logout功能
	 */
	@Clear({LoginInterceptor.class,LogInterceptor.class})	
	public void exit(){
		getSession().removeAttribute("loginUser");
		getSession().invalidate();
		renderFreeMarker("/login.html");
	}
}
